package com.desginer.struct.adapter;

/**
 * 适配器模式（Adapter Pattern）是一种**结构型设计模式**，用于解决接口不兼容的问题。它允许两个不兼容的接口协同工作，通过将一个类的接口转换成客户端期望的另一个接口。
 *
 * ---
 *
 * ### **核心思想**
 * 1. **适配器**（Adapter）：作为中间层，将**不兼容的接口**转换为**目标接口**。
 * 2. **被适配者**（Adaptee）：已存在的类，但其接口不兼容。
 * 3. **目标接口**（Target）：客户端期望使用的接口。
 *
 * ---
 *
 * ### **使用场景**
 * 1. **遗留系统集成**：将旧系统的类接入新接口。
 * 2. **第三方库适配**：统一不同库的相似功能。
 * 3. **接口标准化**：将多个不同接口的类统一为相同接口。
 * 4. **复用旧类**：不修改原有代码的情况下复用功能。
 *
 * ---
 *
 * ### **Java 代码示例**
 * #### 场景描述
 * 假设系统中有：
 * - **旧支付接口**（`LegacyPayment`）：只支持支付金额（无货币单位）。
 * - **新支付接口**（`PaymentProcessor`）：需要支付金额+货币单位（如 "USD 100.0"）。
 * - **适配器**：将旧接口适配到新接口。
 *
 * ---
 *
 * #### **1. 目标接口（新系统）**
 * ```java
 * // 目标接口：新支付系统
 * public interface PaymentProcessor {
 *     void processPayment(String amountWithCurrency); // 格式："USD 100.0"
 * }
 * ```
 *
 * #### **2. 被适配者（旧系统）**
 * ```java
 * // 被适配者：旧支付系统
 * public class LegacyPayment {
 *     public void pay(double amount) {
 *         System.out.println("Paid: " + amount + " (Legacy System)");
 *     }
 * }
 * ```
 *
 * #### **3. 适配器类（关键）**
 * ```java
 * public class PaymentAdapter implements PaymentProcessor {
 *     private final LegacyPayment legacyPayment;
 *
 *     public PaymentAdapter(LegacyPayment legacyPayment) {
 *         this.legacyPayment = legacyPayment;
 *     }
 *
 *     @Override
 *     public void processPayment(String amountWithCurrency) {
 *         // 1. 解析新接口的输入（例如："USD 100.0" -> 100.0）
 *         double amount = parseAmount(amountWithCurrency);
 *
 *         // 2. 调用旧系统的支付方法
 *         legacyPayment.pay(amount);
 *     }
 *
 *     private double parseAmount(String amountWithCurrency) {
 *         // 简单解析逻辑（实际场景需健壮处理）
 *         String[] parts = amountWithCurrency.split(" ");
 *         return Double.parseDouble(parts[1]);
 *     }
 * }
 * ```
 *
 * #### **4. 客户端调用**
 * ```java
 * public class Client {
 *     public static void main(String[] args) {
 *         // 旧支付系统
 *         LegacyPayment legacyPayment = new LegacyPayment();
 *
 *         // 适配器：将旧系统包装成新接口
 *         PaymentProcessor processor = new PaymentAdapter(legacyPayment);
 *
 *         // 客户端按新接口调用
 *         processor.processPayment("USD 100.0");
 *     }
 * }
 * ```
 *
 * #### **输出**
 * ```
 * Paid: 100.0 (Legacy System)
 * ```
 *
 * ---
 *
 * ### **类图**
 * ```plaintext
 * +-------------------+        +------------------+        +------------------+
 * | PaymentProcessor  |        | PaymentAdapter   |        | LegacyPayment    |
 * +-------------------+        +------------------+        +------------------+
 * | processPayment()  |<-------| - legacyPayment  |------->| pay()            |
 * +-------------------+        +------------------+        +------------------+
 *           ^                   | implements                (被适配者)
 *           |                   |
 *           |                   + parseAmount()
 *           |
 * (目标接口)|
 * +-------------------+
 * | Client            |
 * +-------------------+
 * ```
 *
 * ---
 *
 * ### **关键点**
 * 1. **对象适配器**（推荐）：通过组合实现（如示例），更灵活（符合合成复用原则）。
 * 2. **类适配器**：通过多重继承实现（Java 中需用接口+继承），耦合度高。
 * 3. **解耦**：客户端无需知道适配细节，只依赖目标接口。
 * 4. **开闭原则**：新增适配器无需修改已有代码。
 *
 * ---
 *
 * ### **实际业务场景**
 * 1. **支付网关统一**：适配支付宝、微信、银联等不同 SDK 到统一支付接口。
 * 2. **日志框架切换**：将 `Log4j` 的接口适配到 `SLF4J`。
 * 3. **数据格式转换**：将 XML 数据源适配到 JSON 解析器。
 *
 * ```java
 * // 示例：XML 到 JSON 的适配器
 * public class XmlToJsonAdapter implements JsonParser {
 *     private final XmlParser xmlParser;
 *
 *     public XmlToJsonAdapter(XmlParser xmlParser) {
 *         this.xmlParser = xmlParser;
 *     }
 *
 *     @Override
 *     public String parseToJson(String data) {
 *         String xml = convertJsonToXml(data); // 伪代码：JSON转XML
 *         return xmlParser.parse(xml);
 *     }
 * }
 * ```
 *
 * ---
 *
 * ### **优缺点**
 * - **优点**：
 *   - 复用旧代码，避免重复开发。
 *   - 将接口转换逻辑与业务分离。
 * - **缺点**：
 *   - 过度使用会增加系统复杂性（需平衡）。
 *
 * 适配器模式是系统演进中的“桥梁”，让新旧组件无缝协作。
 */
public class AdapterTest {


    public static void main(String[] args) {
        OldPayment legacyPayment = new OldPayment();

        PaymentProcessor processor = new PaymentAdapter(legacyPayment);

        processor.processPayment("USD 100.0");
    }

}
